cssimage: Implement a fallback draw() vfunc
authorBenjamin Otte <otte@redhat.com>
Tue, 13 Dec 2016 04:10:05 +0000 (05:10 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:10 +0000 (18:01 +0100)
... that chains into snapshot. This way, we can stop implementing draw()
in GtkCssImage subclasses and focus on snapshot() instead.

gtk/gtkcssimage.c

index 8797ec900bb96ee4328312f0678dac43e06199de..d45a3f78d4473be453f1ba9377f056ff7cdb9722 100644 (file)
@@ -22,6 +22,7 @@
 #include "gtkcssimageprivate.h"
 
 #include "gtkcssstyleprivate.h"
+#include "gtksnapshotprivate.h"
 
 /* for the types only */
 #include "gtk/gtkcssimagecrossfadeprivate.h"
@@ -95,6 +96,28 @@ gtk_css_image_real_transition (GtkCssImage *start,
     return _gtk_css_image_cross_fade_new (start, end, progress);
 }
 
+static void
+gtk_css_image_real_draw (GtkCssImage *image,
+                         cairo_t     *cr,
+                         double       width,
+                         double       height)
+{
+  GtkSnapshot snapshot;
+  GskRenderNode *node;
+  cairo_region_t *clip;
+
+  clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) { 0, 0, width, height });
+  gtk_snapshot_init (&snapshot, NULL, clip, "Fallback<%s>", G_OBJECT_TYPE_NAME (image));
+  gtk_css_image_snapshot (image, &snapshot, width, height);
+  node = gtk_snapshot_finish (&snapshot);
+
+  if (node != NULL)
+    {
+      gsk_render_node_draw (node, cr);
+      gsk_render_node_unref (node);
+    }
+}
+
 static void
 gtk_css_image_real_snapshot (GtkCssImage *image,
                              GtkSnapshot *snapshot,
@@ -119,6 +142,7 @@ _gtk_css_image_class_init (GtkCssImageClass *klass)
   klass->compute = gtk_css_image_real_compute;
   klass->equal = gtk_css_image_real_equal;
   klass->transition = gtk_css_image_real_transition;
+  klass->draw = gtk_css_image_real_draw;
   klass->snapshot = gtk_css_image_real_snapshot;
 }